/**
 * 输入输出处理模块
 * 负责解析输入状态和格式化输出命令
 */

import { GameState } from './object';
import * as fs from 'fs';

/**
 * 解析输入状态
 * @param inputData - 输入的JSON字符串
 * @returns 解析后的输入状态
 */
export function parseInputState(inputData: string): GameState | {} {
    try {
        const inputState = JSON.parse(inputData.trim());
        return new GameState(inputState);
    } catch (error: any) {
        console.error(`JSON解析错误: ${error.message}`);
        return {};
    }
}

/**
 * 格式化输出命令
 * @param commands - 命令列表
 * @returns 格式化的JSON字符串
 */
export function formatOutputCommands(commands: any[]): string {
    try {
        // 确保 commands 是数组
        if (!Array.isArray(commands)) {
            console.warn('commands 不是数组，返回空数组');
            return '[]';
        }
        // 处理命令数组，如果命令有 toDict 方法则调用，否则直接使用
        const cmds = commands.map(cmd => {
            if (cmd && typeof cmd.toDict === 'function') {
                return cmd.toDict();
            }
            return cmd;
        });

        // 转换为 JSON 字符串
        return JSON.stringify(cmds, null, 0);
    } catch (error: any) {
        console.error(`JSON序列化错误: ${error.message}`);
        return '[]';
    }
}

/**
 * 从文件读取输入
 * @param filepath - 文件路径
 * @returns 文件内容
 */
export function input(filepath: string): string {
    return fs.readFileSync(filepath, 'utf8');
}

/**
 * 输出内容
 * @param s - 要输出的字符串
 * @param file - 输出流，默认为stdout
 * @param is_commands - 是否为命令输出，默认为false
 */
export function output(s: string, file: NodeJS.WriteStream = process.stdout, is_commands: boolean = false): void {
    // 为commands输出添加特殊标识前缀
    if (file === process.stdout && is_commands) {
        file.write(`COMMANDS_OUTPUT:${s}\n`);
    } else {
        file.write(s + '\n');
    }
}